home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 1.iso / toolbox / documents / OpenGL / opengldoc / glspec / detail_texture.spec < prev    next >
Encoding:
Text File  |  1996-11-11  |  16.0 KB  |  409 lines

  1. Name
  2.  
  3.     SGIS_detail_texture
  4.  
  5. Name Strings
  6.  
  7.     GL_SGIS_detail_texture
  8.  
  9. Version
  10.  
  11.     $Date: 1996/04/02 00:07:56 $ $Revision: 1.2 $
  12.  
  13. Number
  14.  
  15.     21
  16.  
  17. Dependencies
  18.  
  19.     EXT_texture is required
  20.     EXT_subtexture affects the definition of this extension
  21.     EXT_copy_texture affects the definition of this extension
  22.     EXT_texture_object affects the definition of this extension
  23.  
  24. Overview
  25.  
  26.     This extension introduces texture magnification filters that blend
  27.     between the level 0 image and a separately defined "detail" image.
  28.     The detail image represents the characteristics of the high frequency
  29.     subband image above the band-limited level 0 image.  The detail image is
  30.     typically a rectangular portion of the subband image which is modified
  31.     so that it can be repeated without discontinuities along its edges.
  32.     Detail blending can be enabled for all color channels, for the alpha
  33.     channel only, or for the red, green, and blue channels only.  It is
  34.     available only for 2D textures.
  35.  
  36.     WARNING - Silicon Graphics has filed for patent protection for some
  37.           of the techniques described in this extension document.
  38.  
  39. Issues
  40.  
  41.     *   Should detail textures be supported in 1D?  3D?  (Currently
  42.     written to support 2D only)
  43.  
  44.     *   Is there any need to support detail textures with NEAREST
  45.     or FILTER4 filtering?  (No)
  46.  
  47.     *   How does detail texture interact with a texture whose
  48.     minimum LOD image is not layer zero?  (Handle this in the LOD
  49.     extension.)
  50.  
  51.     *    Should six detail filters be defined, so that the MODE is part
  52.     of the filter name?  (LINEAR_ADD_DETAIL_SGIS,
  53.     LINEAR_ADD_DETAIL_ALPHA_SGIS, ...)  (No)
  54.  
  55.     *    I have scaled and biased the detail texture value to the range [-1,1]
  56.     in this specification.  I believe that Iris GL scaled and biased to
  57.     [-0.5,0.5].  The [-1,1] range seems clearer to me, if it allows F()
  58.     to be limited to [0,1].  Is this acceptable?
  59.  
  60.     *    Should detail texture objects and 2D texture objects be separate
  61.     sets, or should it be possible to use the same texture object both
  62.     as a detail texture and as a 2D texture?  (Keep them separate)
  63.  
  64. New Procedures and Functions
  65.  
  66.     void DetailTexFuncSGIS(enum target,
  67.                sizei n,
  68.                const float* points);
  69.  
  70.     void GetDetailTexFuncSGIS(enum target,
  71.                   float* points);
  72.  
  73. New Tokens
  74.  
  75.     Accepted by the <target> parameters of GetTexImage,
  76.     GetTexLevelParameterfv, GetTexLevelParameteriv, GetTexParameterfv,
  77.     GetTexParameteriv, TexImage2D, TexParameterf, TexParameterfv,
  78.     TexParameteri, and TexParameteriv.  If the corresponding extensions are
  79.     supported, also accepted by the <target> parameters of TexSubImage2DEXT,
  80.     CopyTexImage2DEXT, CopyTexSubImage2DEXT, and BindTextureEXT:
  81.  
  82.     DETAIL_TEXTURE_2D_SGIS
  83.  
  84.     Accepted by the <pname> parameters of GetBooleanv, GetIntegerv,
  85.     GetFloatv, and GetDoublev:
  86.  
  87.     DETAIL_TEXTURE_2D_BINDING_SGIS
  88.  
  89.     Accepted by the <param> parameter of TexParameteri and TexParameterf,
  90.     and by the <params> parameter of TexParameteriv and TexParameterfv,
  91.     when their <pname> parameter is TEXTURE_MAG_FILTER:
  92.  
  93.     LINEAR_DETAIL_SGIS
  94.     LINEAR_DETAIL_ALPHA_SGIS
  95.     LINEAR_DETAIL_COLOR_SGIS
  96.  
  97.     Accepted by the <pname> parameter of TexParameteri, TexParameterf,
  98.     TexParameteriv, TexParameterfv, GetTexParameteriv, and GetTexParameterfv:
  99.  
  100.     DETAIL_TEXTURE_LEVEL_SGIS
  101.     DETAIL_TEXTURE_MODE_SGIS
  102.  
  103.     Accepted by the <pname> parameter of GetTexParameteriv and
  104.     GetTexParameterfv:
  105.  
  106.     DETAIL_TEXTURE_FUNC_POINTS_SGIS
  107.  
  108. Additions to Chapter 2 of the 1.0 Specification (OpenGL Operation)
  109.  
  110.     None
  111.  
  112. Additions to Chapter 3 of the 1.0 Specification (Rasterization)
  113.  
  114.     GL Specification Table 3.7 is updated as follows:
  115.  
  116.     Name                Type        Legal Values
  117.     ----                ----        ------------
  118.     TEXTURE_WRAP_S            integer        CLAMP, REPEAT
  119.     TEXTURE_WRAP_T            integer        CLAMP, REPEAT
  120.     TEXTURE_WRAP_R_EXT        integer        CLAMP, REPEAT
  121.     TEXTURE_MIN_FILTER        integer        NEAREST, LINEAR,
  122.                             NEAREST_MIPMAP_NEAREST,
  123.                             NEAREST_MIPMAP_LINEAR,
  124.                             LINEAR_MIPMAP_NEAREST,
  125.                             LINEAR_MIPMAP_LINEAR,
  126.                             FILTER4_SGIS
  127.     TEXTURE_MAG_FILTER        integer        NEAREST, LINEAR,
  128.                             FILTER4_SGIS,
  129.                             LINEAR_DETAIL_SGIS,
  130.                             LINEAR_DETAIL_ALPHA_SGIS,
  131.                             LINEAR_DETAIL_COLOR_SGIS
  132.     TEXTURE_BORDER_COLOR        4 floats    any 4 values in [0,1]
  133.     DETAIL_TEXTURE_LEVEL_SGIS    integer        any non-positive integer
  134.     DETAIL_TEXTURE_MODE_SGIS    integer        ADD, MODULATE
  135.  
  136.     Table 3.7: Texture parameters and their values.
  137.  
  138.     3.8.2.1 Texture magnification with detail
  139.  
  140.     Three additional texture magnification filters are defined for texture
  141.     magnification.  These values, which are assigned to TEXTURE_MAG_FILTER,
  142.     are LINEAR_DETAIL_SGIS, LINEAR_DETAIL_ALPHA_SGIS, and
  143.     LINEAR_DETAIL_COLOR_SGIS.  All three filters sample the level zero
  144.     texture array exactly as it would be sampled with filter mode LINEAR.
  145.     All three also sample the level zero texture array of a second
  146.     texture, known as the detail texture, when three conditions are met.
  147.     The detail texture corresponding to texture TEXTURE_2D is
  148.     DETAIL_TEXTURE_2D_SGIS.  The conditions are:
  149.  
  150.     1.  The active texture must be TEXTURE_2D.
  151.  
  152.     2.  The internal formats of TEXTURE_2D and DETAIL_TEXTURE_2D_SGIS
  153.         must have been specified identically.
  154.  
  155.     3.  The level 0 array of DETAIL_TEXTURE_2D_SGIS must have nonzero width 
  156.         and height.
  157.  
  158.     If these conditions are not met, it is as though the magnification
  159.     texture filter was LINEAR.  (Although querying the magnification filter
  160.     value will return the value as specified.)  If they are met, the level
  161.     zero array of the detail texture is also linearly sampled, using the
  162.     following arithmetic:
  163.  
  164.     n = log base 2 of the width of the level zero array of TEXTURE_2D
  165.     m = log base 2 of the height of the level zero array of TEXTURE_2D
  166.     N = log base 2 of the width of DETAIL_TEXTURE_2D_SGIS
  167.     M = log base 2 of the height of DETAIL_TEXTURE_2D_SGIS
  168.     L = DETAIL_TEXTURE_LEVEL_SGIS value of TEXTURE_2D
  169.  
  170.     u = s * 2**(n-L)
  171.     v = t * 2**(m-L)
  172.  
  173.     i0 = floor(u - 1/2) mod 2**N
  174.     j0 = floor(v - 1/2) mod 2**M
  175.  
  176.     i1 = (i0 + 1) mod 2**N
  177.     j1 = (j0 + 1) mod 2**M
  178.  
  179.     A = frac(u - 1/2)
  180.     B = frac(v - 1/2)
  181.  
  182.     Tdetail = (1-A) * (1-B) * detail[i0,j0] +
  183.             A   * (1-B) * detail[i1,j0] +
  184.           (1-A) *   B   * detail[i0,j1] +
  185.             A   *   B   * detail[i1,j1]
  186.  
  187.     Note that magnification corresponds to negative values of level-of-detail 
  188.     and minification corresponds to positive values.  Hence L, the value of the 
  189.     DETAIL_TEXTURE_LEVEL_SGIS parameter of TEXTURE_2D, must be negative.  The 
  190.     absolute value of L can be thought of as the number of levels that 
  191.     separate the level 0 image of TEXTURE_2D and the image of 
  192.     DETAIL_TEXTURE_2D, which is replicated as necessary to fill the appropriate
  193.     number of texels.  For example, if L is -2, the detail texture image is 
  194.     replicated as necessary in x and y to form a single image whose dimensions 
  195.     are four times larger than the level zero array of TEXTURE_2D.
  196.  
  197.     The texture value computed from the primary texture (Ttexture) and
  198.     the value computed from the detail texture (Tdetail) are combined
  199.     in one of two ways to compute the final texture value (T).  The
  200.     values of Ttexture, Tdetail, and T are treated as though they range
  201.     from 0.0 through 1.0 in these equations.
  202.     
  203.     If DETAIL_TEXTURE_MODE_SGIS of TEXTURE_2D is ADD, then
  204.  
  205.     T' = Ttexture + F(LOD) * (2*Tdetail-1)
  206.  
  207.          / 0      T' < 0
  208.     T = <  T'     0 <= T' <= 1
  209.          \ 1      T' > 1
  210.  
  211.     where F is a function of the level-of-detail parameter LOD, which is
  212.     represented by the Greek character lambda in the GL specification.  In
  213.     effect, the detail texture is scaled and biased so that its range is
  214.     [-1,1].  The resulting signed value is scaled by a function of LOD,
  215.     added to the base texture, and clamped to [0,1].
  216.  
  217.     If DETAIL_TEXTURE_MODE_SGIS or TEXTURE_2D is MODULATE, then
  218.  
  219.     T' = Ttexture * (1 + F(LOD) * (2*Tdetail-1))
  220.  
  221.          / 0      T' < 0
  222.     T = <  T'     0 <= T' <= 1
  223.          \ 1      T' > 1
  224.  
  225.     Here again the detail texture is scaled and biased so that its range
  226.     is [-1,1].  The resulting signed value is scaled by a function of LOD,
  227.     and biased by 1.  This result scales the base texture, which is then
  228.     clamped to [0,1].
  229.  
  230.     The function F of level-of-detail parameter LOD is specified by calling
  231.     DetailTexFuncSGIS with <target> set to TEXTURE_2D, <points> pointing at
  232.     an array of pairs of floating point values, and <n> set to the number
  233.     of value pairs in <points>.  The first value of each value pair in
  234.     <points> specifies a value of LOD, and the second value of each value
  235.     pair specifies the corresponding function value.  The order in which
  236.     the points are specified is not significant.  The <n> value pairs in
  237.     <points> completely specify the function, replacing any previous
  238.     specification that may have existed.  Since negative values of LOD
  239.     correspond to magnification and positive values correspond to
  240.     minification, the points should have negative values for LOD (though it
  241.     is not an error to specify positive values).
  242.  
  243.     Function F is evaluated by sorting the value pairs specified by
  244.     DetailTexFuncSGIS by LOD value, then fitting a curve through these
  245.     points.  This curve may be linear between adjacent points, or it may be
  246.     smoothed, but it will pass exactly through the points, limited only by
  247.     the resolution of the implementation.  The value pair with the lowest
  248.     LOD value specifies the function value F for all values of LOD less than
  249.     or equal to that pair's LOD.  Likewise, the value pair with the greatest
  250.     LOD value specifies the function value F for all values of LOD greater
  251.     than or equal to that pair's LOD.  F is undefined if two or more value
  252.     pairs have the same LOD value.
  253.  
  254.     If the texture magnification filter is LINEAR_DETAIL_SGIS, then both
  255.     the color and the alpha components of T are computed as described
  256.     in the equations above.  If the filter is LINEAR_DETAIL_COLOR_SGIS,
  257.     then all components of T other than alpha are computed as described
  258.     above, and the alpha component of T is computed as if the texture
  259.     magnification filter were LINEAR.  Finally, if the filter is
  260.     LINEAR_DETAIL_ALPHA_SGIS, the alpha component of T is computed as
  261.     described in the equations above, and all other components of T
  262.     are computed as if the texture magnification filter were LINEAR.
  263.  
  264.     All OpenGL texture commands that accept a target value of TEXTURE_2D
  265.     also accept the target value DETAIL_TEXTURE_2D_SGIS.  These commands
  266.     operate on and return state of the detail texture just as they do
  267.     of the 2-dimensional texture.
  268.     
  269.     If EXT_texture_object is supported, detail texture objects can be
  270.     created, operated on, and bound just as their 2D counterparts are.  The
  271.     sets of detail textures and 2D textures are exclusive, however, so it
  272.     is not possible to use a texture object both as a 2D texture and as
  273.     a detail texture.  By default zero is bound to DETAIL_TEXTURE_2D_SGIS,
  274.     just as zero is bound to TEXTURE_2D.
  275.  
  276.     Specification of a detail texture
  277.     ---------------------------------
  278.  
  279.     A detail texture is specified by calling TexImage2D or CopyTexImage2DEXT
  280.     with <target> set to DETAIL_TEXTURE_2D_SGIS, <level> set to 0, <border>
  281.     set to 0, and the other parameters specified to generate the desired
  282.     image.
  283.  
  284.     Minification vs. Magnification
  285.     ------------------------------
  286.  
  287.     If the magnification filter is given by LINEAR_DETAIL_SGIS,
  288.     LINEAR_DETAIL_ALPHA_SGIS, or LINEAR_DETAIL_COLOR_SGIS, and the
  289.     minification filter is given by NEAREST_MIPMAP_NEAREST or
  290.     LINEAR_MIPMAP_NEAREST, then c = 0.5.  The parameter c is used to
  291.     determine whether minification or magnification filtering is done,
  292.     as described in Section 3.8.2 of the GL Specification (Texture
  293.     Magnification).
  294.  
  295. Additions to Chapter 4 of the 1.0 Specification (Per-Fragment Operations
  296. and the Framebuffer)
  297.  
  298.     None
  299.  
  300. Additions to Chapter 5 of the 1.0 Specification (Special Functions)
  301.  
  302.     GetDetailTexFuncSGIS is not included in display lists.
  303.  
  304. Additions to Chapter 6 of the 1.0 Specification (State and State Requests)
  305.  
  306.     Although many of the parameter values of a detail texture have no
  307.     effect on texture operation, they are maintained and may be queried.
  308.     There is no value associated with the binding point
  309.     DETAIL_TEXTURE_2D_SGIS, so it is not accepted as the <pname> parameter
  310.     of GetBooleanv, GetIntegerv, GetFloatv, or GetDoublev.  The name of
  311.     the detail texture that is bound to DETAIL_TEXTURE_2D_SGIS is queried
  312.     by calling GetBooleanv, GetIntegerv, GetFloatv, or GetDoublev with
  313.     <pname> set to DETAIL_TEXTURE_2D_BINDING_SGIS.  Zero is returned if
  314.     no texture has been bound.
  315.  
  316.     The number of points in the detail texture function specification of
  317.     a texture is queried by calling GetTexParameteriv or GetTexParameterfv
  318.     with <target> set to the target of the desired texture and <pname> set
  319.     to DETAIL_TEXTURE_FUNC_POINTS_SGIS.  The function
  320.     GetDetailTexFuncSGIS returns in <points> all of the points in the detail
  321.     texture function of texture <target>.
  322.  
  323. Additions to the GLX Specification
  324.  
  325.     None
  326.  
  327. Dependencies on EXT_texture
  328.  
  329.     EXT_texture is required.
  330.  
  331. Dependencies on EXT_texture3D
  332.  
  333.     None, because detail texture is not specified for 3D textures.  This
  334.     extensions is designed to allow a subsequent extension to define 3D
  335.     detail textures, however.
  336.  
  337. Dependencies on EXT_subtexture
  338.  
  339.     If EXT_subtexture is not implemented, then the references to 
  340.     TexSubImage2DEXT and CopyTexSubImage2DEXT in this file are invalid,
  341.     and should be ignored.
  342.  
  343. Dependencies on EXT_copy_texture
  344.  
  345.     If EXT_copy_texture is not implemented, then the references to
  346.     CopyTexImage2DEXT and CopyTexSubImage2DEXT in this file are invalid,
  347.     and should be ignored.
  348.  
  349. Dependencies on EXT_texture_object
  350.  
  351.     If EXT_texture_object is not implemented, then the references to
  352.     BindTextureEXT are invalid, and should be ignored.
  353.  
  354.     If EXT_texture_object is implemented, the state values named
  355.  
  356.     DETAIL_TEXTURE_LEVEL_SGIS
  357.     DETAIL_TEXTURE_MODE_SGIS
  358.     DETAIL_TEXTURE_FUNC_POINTS_SGIS
  359.     <DETAIL_TEXTURE_FUNC>
  360.  
  361.     are added to the state vector of each texture object. When an attribute
  362.     set that includes texture information is popped, the bindings and
  363.     enables are first restored to their pushed values, then the bound
  364.     textures have their detail parameters restored to their pushed values.
  365.  
  366. Errors
  367.  
  368.     INVALID_VALUE is generated if TexImage2D or CopyTexImage2DEXT
  369.     parameter <target> is DETAIL_TEXTURE_2D_SGIS, and parameter <level>
  370.     or parameter <border> is not zero.
  371.  
  372.     INVALID_VALUE is generated if BindTextureEXT parameter <target> is
  373.     DETAIL_TEXTURE_2D_SGIS, and parameter <texture> is not the name of a
  374.     detail texture, the name of an as yet unbound texture, or zero.
  375.  
  376.     INVALID_VALUE is generated if TexParameteri, TexParameterf,
  377.     TexParameteriv, or TexParameterfv parameter <pname> is
  378.     DETAIL_TEXTURE_MODE_SGIS, and parameter <param> is not ADD or MODULATE,
  379.     or parameter <params> doesn't point to ADD or MODULATE.
  380.  
  381.     INVALID_VALUE is generated if TexParameteri, TexParameterf,
  382.     TexParameteriv, or TexParameterfv parameter <pname> is
  383.     DETAIL_TEXTURE_LEVEL_SGIS, and parameter <param> is positive,
  384.     or parameter <params> points to a positive value.
  385.  
  386.     INVALID_ENUM is generated if DetailTexFuncSGIS or
  387.     GetDetailTexFuncSGIS parameter <target> is not TEXTURE_2D.
  388.  
  389.     INVALID_VALUE is generated if DetailTexFuncSGIS parameter <n> is
  390.     negative.
  391.  
  392.     INVALID_OPERATION is generated if DetailTexFuncSGIS or
  393.     GetDetailTexFuncSGIS is executed between execution of Begin and the
  394.     corresponding execution to End.
  395.  
  396. New State
  397.  
  398.     Get Value                Get Command        Type        Initial Value    Attribute
  399.     ---------                -----------        ----        -------------    ---------
  400.     DETAIL_TEXTURE_2D_BINDING_SGIS    GetIntegerv        Z+        0        texture
  401.     DETAIL_TEXTURE_LEVEL_SGIS        GetTexParameteriv    n x Z-        -4        texture
  402.     DETAIL_TEXTURE_MODE_SGIS        GetTexParameteriv    n x Z2        ADD        texture
  403.     DETAIL_TEXTURE_FUNC_POINTS_SGIS    GetTexParameteriv    n x Z+        2        texture
  404.     <DETAIL_TEXTURE_FUNC>        GetDetailTexFuncSGIS    n x m x R    {0, 0}, {-4, 1}    texture
  405.  
  406. New Implementation Dependent State
  407.  
  408.     None
  409.